﻿// 201.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <queue>
#include <memory.h>

using namespace std;
/*
http://oj.daimayuan.top/course/14/problem/630

给你一张 n个点 m条边的无向简单图，点的编号为 1到 n，每条边的长度都是 1。

现在有 k组询问，每组询问我们想知道两个点 u,v的距离。

输入格式
第一行三个整数 n,m,k分别表示图的点数、边数和询问数。

接下来 m行，每行两个整数 x,y
，表示 x号点和 y号点之间有一条边。

接下来 k 行，每行两个整数 u,v表示一组询问。

输出格式
输出共 k行，对于每一组询问，输出一行一个数表示两个点的距离，如果两个点不连通，输出 -1。

样例输入
3 2 2
1 2
2 3
1 2
1 3
样例输出
1
2
数据规模
对于所有数据，保证 2≤n≤20000,0≤m≤100000,1≤k≤10,1≤x,y,u,v≤n,x≠y。
*/

const int N = 20010,M = 400010;
int h[N], e[M], ne[M], idx;
int n, m, k;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int solve(int start, int end) {
	queue<pair<int,int>> q;
	int vis[N]; memset(vis, 0, sizeof vis);
	q.push({ start,0 });
	vis[start] = 1;
	
	while (!q.empty()) {
		int curr = q.front().first; int step = q.front().second;
		q.pop();
		if (curr == end) {
			return step;
		}

		for (int i = h[curr]; i != -1; i = ne[i]) {
			int next = e[i];
			if (vis[next] == 0) {
				q.push({ next,step + 1 });
				vis[next] = 1;
			}

		}
	}

	return -1;
}

int main()
{
	cin >> n >> m>>k;
	memset(h, -1, sizeof h);
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		add(a, b); add(b, a);
	}
	
	for (int i = 0; i < k; i++ ) {
		int u, v; cin >> u >> v;
		cout << solve(u,v)<<endl;
	}


	return 0;
}

 